#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
@author António Delgado
@date: 20/10/14
@obs: Módulo referente à leitura da base de dados sqlite3
de modo a retornar os dados das respectivas colunas
"""

import get_data_db
import pylab as p
import numpy as np
import matplotlib.pyplot as plt

class Graphics(object):
	"""
	Classe que cria um gráfico, recorrendo ao matplotlib, 
	dependendo da flag recebida no construtor.
	A flag determina o tipo de estatística a apresentar.
	"""
	def __init__(self, flag, first_year = None, last_year = None):
		super(Graphics, self).__init__()

		self.flag = flag
		self.first_year = first_year
		self.last_year = last_year

		self.data = get_data_db.GetData()

		self.first_index = self.data.get_years_col().index(self.first_year)
		self.last_index = self.data.get_years_col().index(self.last_year)
 
		self.xValues = []

		for x in self.data.get_years_col():
			if (x >= self.first_year) & (x <= self.last_year):
				self.xValues.append(x)
				pass
			pass

		if self.flag == "ipc_stat":
			self.ipc_stat()
			pass
		elif self.flag == "inflation_rate_stat":
			self.inflation_rate_stat()
			pass
		elif self.flag == "minimum_monthly_pay_stat":
			self.minimum_monthly_pay_stat()
			pass
		elif self.flag == "maximum_monthly_pay_stat":
			self.maximum_monthly_pay_stat()
			pass
		elif self.flag == "maximum_minimum_salaries_stat":
			self.maximum_minimum_salaries_stat()
			pass
		elif self.flag == "pib_per_capita_stat":
			self.pib_per_capita_stat()
			pass
		elif self.flag == "rnb_per_capita_stat":
			self.rnb_per_capita_stat()
			pass
		elif self.flag == "rdb_per_capita_stat":
			self.rdb_per_capita_stat()
			pass
		elif self.flag == "per_capita_annual_remuneration_stat":
			self.per_capita_annual_remuneration_stat()
			pass

	# def autoLabel(self, plot, ax):
	# 	"""
	# 	Coloca os valores exatos do comprimento da barra a meio desta.
	# 	@param plot - dados do gráfico
	# 	"""
	# 	for rect in plot:
	# 		height = rect.get_height()
	# 		if not height == 0:
	# 			ax.text(rect.get_x() + rect.get_width() / 2., 0.5*height, '%f'%float(height), ha = "center", va = "bottom")
	# 			pass
	# 	pass

	def convert_string_to_int(self, array):
		"""
		Converte um array de strings num array de inteiros
		"""
		new_array = []

		for x in xrange(len(array)):
			new_array.append(int(array[x]))
			pass

		return new_array
		pass

	def get_array_in_interval(self, array):
		"""
		Retorna um array dependendo do intervalo de anos, 
		dado pelas comboboxes
		"""
		values = []
		for x in xrange(self.first_index, self.last_index + 1):
			values.append(float(array[x]))
			pass

		return values

		pass

	def ipc_stat(self):
		"""
		Cria o gráfico referente à estatística 
		Índice de preços ao consumidor (IPC)
		"""
		fig = p.figure()
		ax = fig.add_subplot(111)
		yValues = self.get_array_in_interval(self.data.get_ipc_col())

		N = len(yValues)
		ind = range(N)
		barWidth = 0.5
		plot = ax.bar(self.convert_string_to_int(self.xValues), yValues, align = 'center')
		ax.set_ylabel(u'Índice de preços ao consumidor')
		ax.set_title(u'IPC ao longo dos anos')
		ax.set_xticks(self.convert_string_to_int(self.xValues))

		ax.set_xticklabels(self.xValues, rotation=90, size='small')
		
		# self.autoLabel(plot, ax)

		p.grid()
		p.show()
		pass

	def inflation_rate_stat(self):
		"""
		Cria o gráfico referente à estatística 
		Taxa de inflação
		"""
		fig = p.figure()
		ax = fig.add_subplot(111)
		yValues = self.get_array_in_interval(self.data.get_inflation_rate_col())
		N = len(yValues)
		ind = range(N)
		barWidth = 0.5
		plot = ax.bar(self.convert_string_to_int(self.xValues), yValues, align = 'center')
		ax.set_ylabel(u'Taxa de inflação')
		ax.set_title(u'Taxa de inflação ao longo dos anos')
		ax.set_xticks(self.convert_string_to_int(self.xValues))

		ax.set_xticklabels(self.xValues, rotation=90, size='small')
		
		# self.autoLabel(plot, ax)

		p.grid()
		p.show()
		pass

	def minimum_monthly_pay_stat(self):
		"""
		Cria o gráfico referente à estatística 
		Remuneração mínima mensal dos funcionários públicos
		"""
		fig = p.figure()
		ax = fig.add_subplot(111)
		yValues = self.get_array_in_interval(self.data.get_minimum_monthly_pay_col())
		N = len(yValues)
		ind = range(N)
		barWidth = 0.5
		plot = ax.bar(self.convert_string_to_int(self.xValues), yValues, align = 'center')
		ax.set_ylabel(u'Remuneração mínima mensal')
		ax.set_title(u'Remuneração mínima mensal dos funcionários públicos')
		ax.set_xticks(self.convert_string_to_int(self.xValues))

		ax.set_xticklabels(self.xValues, rotation=90, size='small')
		
		# self.autoLabel(plot, ax)

		p.grid()
		p.show()
		pass

	def maximum_monthly_pay_stat(self):
		"""
		Cria o gráfico referente à estatística 
		Remuneração máxima mensal dos funcionários públicos
		"""
		fig = p.figure()
		ax = fig.add_subplot(111)
		yValues = self.get_array_in_interval(self.data.get_maximum_monthly_pay_col())
		N = len(yValues)
		ind = range(N)
		barWidth = 0.5
		plot = ax.bar(self.convert_string_to_int(self.xValues), yValues, align = 'center')
		ax.set_ylabel(u'Remuneração máxima mensal')
		ax.set_title(u'Remuneração máxima mensal dos funcionários públicos')
		ax.set_xticks(self.convert_string_to_int(self.xValues))

		ax.set_xticklabels(self.xValues, rotation=90, size='small')
		
		# self.autoLabel(plot, ax)

		p.grid()
		p.show()
		pass

	def maximum_minimum_salaries_stat(self):
		"""
		Cria o gráfico referente à estatística 
		Evolução das remunerações máximas e mínimas mensais dos funcionários públicos a preços
		constantes
		"""
		fig, ax = plt.subplots()

		yValues_minimum = self.get_array_in_interval(self.data.get_minimum_monthly_pay_col())
		yValues_maximum = self.get_array_in_interval(self.data.get_maximum_monthly_pay_col())

		N = len(yValues_minimum)
		ind = np.arange(N)
		barWidth = 0.3
		plot_minimum = ax.bar(ind, yValues_minimum, barWidth, color="r")

		plot_maximum = ax.bar(ind + barWidth, yValues_maximum, barWidth, color="y")
		
		ax.set_title(u'Evolução das remunerações máximas e mínimas mensais \n dos funcionários públicos a preços constantes')
		ax.set_xticks(ind+barWidth)

		ax.set_xticklabels(self.xValues, rotation=90, size='small')

		ax.legend( (plot_minimum[0], plot_maximum[0]), (u'Remuneração mínima mensal', u'Remuneração máxima mensal') )
		
		# self.autoLabel(plot, ax)

		plt.grid()
		plt.show()
		pass

	def pib_per_capita_stat(self):
		"""
		Cria o gráfico referente à estatística 
		Produto interno bruto anual (PIB) per capita
		"""
		fig = p.figure()
		ax = fig.add_subplot(111)
		yValues = self.get_array_in_interval(self.data.get_pib_per_capita_col())
		N = len(yValues)
		ind = range(N)
		barWidth = 0.5
		plot = ax.bar(self.convert_string_to_int(self.xValues), yValues, align = 'center')
		ax.set_ylabel(u'PIB per capita')
		ax.set_title(u'PIB per capita ao longo dos anos')
		ax.set_xticks(self.convert_string_to_int(self.xValues))

		ax.set_xticklabels(self.xValues, rotation=90, size='small')
		
		# self.autoLabel(plot, ax)

		p.grid()
		p.show()
		pass

	def rnb_per_capita_stat(self):
		"""
		Cria o gráfico referente à estatística 
		Rendimento nacional anual bruto per capita
		"""
		fig = p.figure()
		ax = fig.add_subplot(111)
		yValues = self.get_array_in_interval(self.data.get_rnb_per_capita_col())
		N = len(yValues)
		ind = range(N)
		barWidth = 0.5
		plot = ax.bar(self.convert_string_to_int(self.xValues), yValues, align = 'center')
		ax.set_ylabel(u'Rendimento nacional bruton per capita')
		ax.set_title(u'Rendimento nacional bruton per capita ao longo dos anos')
		ax.set_xticks(self.convert_string_to_int(self.xValues))

		ax.set_xticklabels(self.xValues, rotation=90, size='small')
		
		# self.autoLabel(plot, ax)

		p.grid()
		p.show()
		pass

	def rdb_per_capita_stat(self):
		"""
		Cria o gráfico referente à estatística 
		Rendimento disponível anual bruto per capita
		"""
		fig = p.figure()
		ax = fig.add_subplot(111)
		yValues = self.get_array_in_interval(self.data.get_rdb_per_capita_col())
		N = len(yValues)
		ind = range(N)
		barWidth = 0.5
		plot = ax.bar(self.convert_string_to_int(self.xValues), yValues, align = 'center')
		ax.set_ylabel(u'Rendimento disponível anual bruto per capita')
		ax.set_title(u'Rendimento disponível anual bruto per capita ao longo dos anos')
		ax.set_xticks(self.convert_string_to_int(self.xValues))

		ax.set_xticklabels(self.xValues, rotation=90, size='small')
		
		# self.autoLabel(plot, ax)

		p.grid()
		p.show()
		pass

	def per_capita_annual_remuneration_stat(self):
		"""
		Cria o gráfico referente à estatística 
		Remunerações per capita anuais
		"""
		fig = p.figure()
		ax = fig.add_subplot(111)
		yValues = self.get_array_in_interval(self.data.get_per_capita_annual_remuneration_col())
		N = len(yValues)
		ind = range(N)
		barWidth = 0.5
		plot = ax.bar(self.convert_string_to_int(self.xValues), yValues, align = 'center')
		ax.set_ylabel(u'Remunerações per capita anuais')
		ax.set_title(u'Remunerações per capita anual ao longo dos anos')
		ax.set_xticks(self.convert_string_to_int(self.xValues))

		ax.set_xticklabels(self.xValues, rotation=90, size='small')
		
		# self.autoLabel(plot, ax)

		p.grid()
		p.show()
		pass